package com.atguigu.day17.list03;

import org.junit.Test;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/*
List: 特点 有序
          不唯一
      遍历: 4种
      实现类:
           数组  ArrayList vs  Vector:
                同: 1.底层都是数组 Object[]
                    2.有共同的父亲 AbstractList
                不同:
                   1.创建对象时底层数组长度不同
                      ArrayList 底层数组长度为0 第一次添加数据时 长度为10
                      Vector 底层数组长度为10
                   2.扩容规则不同:
                       ArrayList: 原来的1.5倍
                       Vector:  capacityIncrement=0    原来的2倍
                                capacityIncrement>0    旧的长度+capacityIncrement
                   3.线程安全问题
                         ArrayList: 线程不安全 效率高
                         Vector:   线程安全  效率低
           双向链表: LinkedList:
                      新增了操作头尾的方法
                      模拟栈和队列操作:
                             栈: FILO first in last out
                                 刷盘子 压子弹
                             队列: FIFO first in first out
                                超市结账
 */
public class LinkedListTest {
    @Test
    public void test05(){
        Deque<Integer> deque = new LinkedList<>();
        deque.add(1);
        deque.add(2);
        deque.add(3);
        deque.add(4);
        deque.add(5);

        deque.pop();

        Integer peek = deque.peek();
        System.out.println(peek);
    }


    @Test
    public void test04(){
        Queue<String> queue = new LinkedList<>();

        queue.add("张三");
        queue.add("李四");
        queue.add("王五");
        queue.add("赵六");
        queue.add("陈一");

        //出队
        queue.poll();//运行过多会返回特殊值
        queue.poll();
        queue.poll();
        queue.poll();
        queue.poll();
        queue.poll();
       /* queue.remove();  移出过多会出异常,运行时异常
        queue.remove();
        queue.remove();
        queue.remove();
        queue.remove();
        queue.remove();*/

        //获取 队头 元素
        System.out.println("queue.peek() = " + queue.peek());
    }



    @Test
    public void test03(){
        //todo 模拟栈操作
        Deque<String> deque = new LinkedList<>();

        deque.push("张三");
        deque.push("李四");
        deque.push("王五");
        deque.push("赵六");

        //弹栈
        deque.pop();


        //获取栈顶元素
        String peek = deque.peek();
        System.out.println("peek = " + peek);


    }

    @Test
    public void test01() {
        LinkedList<String> list = new LinkedList<>();
        list.add("杨幂");
        list.add("杨颖");
        list.add("杨洋");
        System.out.println("list = " + list);
    }

    @Test
    public void test02() {

        LinkedList<String> list = new LinkedList<>();
        list.add("杨幂");
        list.add("杨颖");
        list.add("杨洋");
        list.add("杨坤");
        System.out.println("list = " + list);

        list.addFirst("安琪拉");
        list.addLast("米莱迪");
        System.out.println("list = " + list);//[安琪拉, 杨幂, 杨颖, 杨洋, 杨坤, 米莱迪]

        System.out.println("list.getFirst() = " + list.getFirst());
        System.out.println("list.getLast() = " + list.getLast());

        list.removeFirst();
        list.removeLast();
        System.out.println("list = " + list);
    }


}
